home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 199_01 / ged9.c < prev    next >
Text File  |  1987-12-15  |  4KB  |  204 lines

  1. /*
  2. Header:          CUG199;
  3. Title:           Module 9 of ged editor;
  4. Last Updated:    11/29/87;
  5.  
  6. Description:    "PURPOSE: manages virtual memory";
  7.  
  8. Keywords:        e, editor, qed, ged, DeSmet, MSDOS;
  9. Filename:        ged9.c;
  10. Warnings:       "O file must be present during link for ged";
  11.  
  12. Authors:         G. Nigel Gilbert, James W. Haefner, and Mel Tearle;
  13. Compilers:       DeSmet 2.51;
  14.  
  15. References:
  16. Endref;
  17. */
  18.  
  19. /*
  20. e/qed/ged  screen editor
  21.  
  22. (C) G. Nigel Gilbert, MICROLOGY, 1981 - August-December 1981
  23.  
  24. Modified:  Aug-Dec   1984:  BDS-C 'e'(vers 4.6a) to 'qe' (J.W. Haefner)
  25.            March     1985:  BDS-C 'qe' to DeSmet-C 'qed' (J.W. Haefner)
  26.  
  27.            May       1986:  qed converted to ged         (Mel Tearle)
  28.            August    1987:  ged converted to MSC 4.0     (Mel Tearle)
  29.  
  30. File:      ged9.c
  31.  
  32. Functions: initvm, freememslot, swapout, writepage,
  33.            swappin, readpage, fatalerror
  34. */
  35.  
  36.  
  37. #ifndef  TC
  38. #include "ged.h"
  39. #else
  40. #include "ged.t"
  41. #endif
  42.  
  43.  
  44. /* initialise virtual memory system
  45.  */
  46. void initvm()
  47. {
  48. int  slot;
  49.  
  50. unsigned  int mem, stk;
  51. unsigned  char  *base, *pagemem, *stkaddr;
  52.  
  53. #ifdef  MSC
  54.   mem = _memavl();
  55.   stk = stackavail();
  56.   slotsinmem = ( mem - stk )/PAGESIZE;
  57.   pagemem = (char *)( 65535 - mem );
  58. #else
  59.   freeall( 5000 );
  60.   stkaddr = _showsp();
  61.   pagemem = _memory();
  62.   slotsinmem = ( stkaddr-STKSPACE-pagemem )/PAGESIZE;
  63. #endif
  64.  
  65. if ( slotsinmem < 3 )  {
  66.      putstr( " More memory needed to run 'ged' " );
  67.      exit(0);
  68. }
  69.  
  70. if ( slotsinmem > MAXMEMSLOTS )  slotsinmem = MAXMEMSLOTS;
  71.  
  72. for ( slot = 0, base = pagemem;
  73.       slot < slotsinmem; slot++, base += PAGESIZE )  {
  74.       usage[slot] = FREE;
  75.       slotaddr[slot] = base;
  76. }
  77. pclock = 0;
  78.  
  79. /* reserve slot 0 for tp
  80.  */
  81. tp = ( struct addr * )pagemem;
  82.  
  83. tppages  = 1;
  84. usage[0] = NOTAVAIL;
  85.  
  86. /* force balloc to find a new page to start
  87.  */
  88. pageloc[(newpage = 0)] = FREE;
  89. allocp = PAGESIZE+1;
  90.  
  91. /* paging file not yet created
  92.  */
  93. pagefd = NOFILE;
  94. strcpy( pagingfile, " :$$$.@@@" );
  95. pagingfile[0] = ( ( pagingdisk ) ? pagingdisk : ( char )( curdsk+'A' ) );
  96.  
  97. /* don't remove - needed to initialize environment
  98.  */
  99. puttext();
  100. }
  101.  
  102.  
  103. /* returns the number of a free memory slot,
  104.  * possibly by swapping out the least recently
  105.  * used page currently in memory
  106.  */
  107. int freememslot()
  108. {
  109. int  use, u;
  110. int  i, slot;
  111.  
  112. for ( use = MAXINT, i = 0; use && i < slotsinmem; i++ )
  113.       if ( ( u = usage[i] ) != NOTAVAIL && u < use )  {
  114.              use  = u;
  115.              slot = i;
  116.       }
  117. /* no free slots */
  118. if ( use )
  119.      swapout( slot );
  120. return  slot;
  121. }
  122.  
  123.  
  124. /* swaps page currently in memory at 'slot' to disk,
  125.  * updating pageloc to show new location
  126.  */
  127. void swapout(slot)
  128. int  slot;
  129. {
  130. int  *pl;
  131.  
  132. /* find page number of page at 'slot'
  133.  */
  134. for ( pl = &pageloc[0]; *pl != slot; pl++ );
  135.      *pl =-( writepage( slot ) );
  136.     /* update pageloc with disk slot written to */
  137. }
  138.  
  139.  
  140. /* writes page currently in memory at 'slot' to disk;
  141.  * returns disk slot where written
  142.  */
  143. unsigned writepage(slot)
  144. int slot;
  145. {
  146. unsigned loc;
  147. long sekbytes;
  148.  
  149. if ( pagefd == NOFILE )  {
  150.      if ( ( pagefd = creat( pagingfile ) ) == FAIL )
  151.             fatalerror( " Can't create a buffer file" );
  152.             for ( loc = 0; loc < MAXSLOTS; loc++ )
  153.                   dskslots[loc] = FREE;
  154. }
  155.  
  156. for ( loc = 0; dskslots[loc] != FREE; loc++ );   /* find a free slot */
  157.  
  158. sekbytes = 1L*loc*PAGESIZE;
  159.  
  160. if ( lseek( pagefd, sekbytes, ABSOLUTE ) == -1L )
  161.      fatalerror(" Bad seek in writing buffer ");
  162.  
  163. if ( write( pagefd, slotaddr[slot], PAGESIZE ) == FAIL )
  164.      fatalerror(" Can't write to buffer - disk full " );
  165.  
  166. dskslots[loc] = INUSE;
  167. usage[slot]   = FREE;
  168. return  loc;
  169. }
  170.  
  171.  
  172. /* get 'page', currently on disk,
  173.  * into memory and return slot where placed
  174.  */
  175. int swappin(page)
  176. int  page;
  177. {
  178. int  slot;
  179.  
  180. readpage( ( slot = freememslot() ), -pageloc[page] );
  181. usage[slot] = INUSE;
  182.  
  183. return pageloc[page] = slot;
  184. }
  185.  
  186.  
  187. /* read a page from disk into memory at 'memslot'
  188.  */
  189. void readpage(memslot,dskslot)
  190. unsigned  memslot, dskslot;
  191. {
  192. long sekbytes;
  193.  
  194. sekbytes = 1L*dskslot*PAGESIZE;
  195.  
  196. if ( lseek( pagefd, sekbytes, ABSOLUTE ) == -1L )
  197.      fatalerror(" Bad seek in reading buffer ");
  198.  
  199. if ( read( pagefd, slotaddr[memslot], PAGESIZE ) != PAGESIZE )
  200.      fatalerror(" Can't read buffer ");
  201.  
  202. dskslots[dskslot] = FREE;
  203. }
  204.